package com.sakiko.aspects;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * description: 存储的提取的通知代码以及切点表达式(选中目标的方法的一种表达式)
 * 1、切面类加入到 ioc容器，并且指定为切面类 [@Component、@Aspect]
 * 2、根据业务定义具体的通知方法 (前置、返回、后置、异常)
 *      try
 *          前置通知 @Before
 *          目标方法
 *          返回通知 【不报错执行】 @AfterReturning
 *      catch
 *          异常通知 【报错执行】 @AfterThrowing
 *      finally
 *          后置通知 【一定执行】 @After
 * 3、编写切点表达式 确定插入的目标方法
 *      切点表达式 -> 选择器语法 -> 目标的方法
 *
 * 总结: spring-aop 框架的使用
 *  1、新建项目导入依赖 (ioc di / test / aop [spring-aop spring-aspect aspectj])
 *  2、正常写业务逻辑，并且将目标对象配置到 ioc容器
 *  3、准备切面类 + 通知方法 以及相关注解支持 ( aop注解)
 *      切面: @Aspect
 *      加入容器: @Component
 *      通知: @Before @AfterReturning @AfterThrowing @After
 *  4、开启 Aspectj注解支持 (xml / 配置类注解)
 *      xml: <aop:aspectj-autoproxy />
 *      配置类: @EnableAspectJAutoProxy
 *
 * spring ioc/di: 1、xml    2、注解 + xml      3、注解 + 配置类
 * spring aop: 1、注解 + 配置类      2、注解 + xml      3、xml
 */

// todo: aop_01
@Aspect
@Component
public class LogAspect {

    @Before("execution(* com.sakiko.aop_01.impl.*.*(..))")
    public void before() {
        System.out.println("老弟来啦...");
        System.out.println("时间: " + System.currentTimeMillis());
    }

    @After("execution(* com.sakiko.aop_01.impl.*.*(..))")
    public void after() {
        System.out.println("老弟白白...");
        System.out.println("时间: " + System.currentTimeMillis());
    }
}